import { LoginAPI, UserInfoAPI, UserMessageAPI } from '@/api/index';
import { getItem, setItem, removeItem, setTimeStamp } from '@/utils/auth';
import { resetRouter } from '@/router';
const TOKEN_KEY = 'IHRM_TOKEN';

const state = () => {
    return {
        token: getItem(TOKEN_KEY) || '',
        userInfo: {}
    };
};

const mutations = {
    // 获取用户token的mutation，向state的token中存值《《《《————————————————————————
    setLoginToken(state, token) {
        state.token = token; // 将数据设置给vuex
        setItem(TOKEN_KEY, token); // vuex 和  缓存数据的同步
    },

    // 获取用户信息的mutation，向state中的userInfo中存值《《《《————————————————————————
    setUserInfo(state, userInfo) {
        state.userInfo = userInfo;
    },

    // 删除用户token的mutation，退出登录的时候，将state中的token删除《《《《————————————————————————
    removetoken(state) {
        state.token = ''; // 将vuex中的token置空
        removeItem(TOKEN_KEY); // 将置空后的loginToken同步到缓存
    },

    // 删除用户信息的mutation，退出登录的时候，删除用户信息《《《《————————————————————————
    removeUserInfo(state) {
        state.userInfo = {};
    }
};

const actions = {
    // 封装函数 调用登录接口《《《《————————————————————————
    async asyncLoginToken(store, value) {
        const { mobile, password } = value;
        const data = await LoginAPI({
            mobile,
            password
        });
        console.log(data);
        store.commit('setLoginToken', data);
        setTimeStamp(); // 只要用户登录成功，就说明有token了，则记录当前的时间戳
    },

    // 封装函数 调用获取用户资料的接口《《《《————————————————————————
    async getUserInfo(store) {
        const result = await UserInfoAPI();
        const baseInfo = await UserMessageAPI(result.userId);
        // eslint-disable-next-line object-curly-spacing
        store.commit('setUserInfo', {...result, ...baseInfo });
        return result;
    },

    // 封装函数，点击后退出登录《《《《————————————————————————
    async logOut(store) {
        // 清除token
        store.commit('removetoken');
        // 清除用户资料
        store.commit('removeUserInfo');
        // 重置路由
        resetRouter();
        // 重置vuex中的routes
        // { root: true }  表示允许访问根级中的mutations和actions。以此来访问其他子模块中的mutations和actions
        store.commit('permission/setRoutes', [], { root: true });
    }
};

const loginModule = {
    namespaced: true,
    state: state(),
    mutations,
    actions
};

export default loginModule;